package com.starlinkdt.common.utils;

import com.starlinkdt.common.utils.reflect.ReflectUtils;
import com.starlinkdt.common.utils.spring.SpringUtils;

import java.lang.reflect.Method;

/**
 * 反射工具类
 *
 * @author system
 */
public class MyReflectUtils {
    /**
     * 直接调用对象方法, 无视private/protected修饰符，
     * 用于一次性调用的情况，否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
     * 只匹配函数名，如果有多个同名函数调用第一个。
     */
    public static <E> E invokeMethodByName(String className, String methodName, final Object[] args) {
        try {
            // 类名首字母小写
            className = className.substring(0, 1).toLowerCase() + className.substring(1);
            // 方法名首字母小写
            methodName = methodName.substring(0, 1).toLowerCase() + methodName.substring(1);
            // 方法调用
            return ReflectUtils.invokeMethodByName(SpringUtils.getBean(className), methodName, args);
        } catch (Exception e) {
            throw new RuntimeException(e.getCause().getMessage());
        }
    }

    public static boolean isStringMethodExist(String className, String methodName) {
        try {
            // 类名首字母小写
            className = className.substring(0, 1).toLowerCase() + className.substring(1);
            // 方法名首字母小写
            methodName = methodName.substring(0, 1).toLowerCase() + methodName.substring(1);

            Method method = SpringUtils.getBean(className).getClass().getDeclaredMethod(methodName, String.class);

            return true;
        } catch (Exception e) {
            return false;
        }

    }
}
